package singleton.source;

import java.io.Serializable;

/**
 * 单例模式
 * @author cheng:
 * @date 2019/4/20 9:40
 */
public class SafeLazySingleton implements Serializable {

    private static SafeLazySingleton instance;

    /**
     * 私有化构造方法
     */
    private SafeLazySingleton() {}

    /**
     * 懒汉式，在方法上加锁。可行但是效率非常低，因为
     * 每个线程在想获得类的实例时候，执行getInstance()方法都要进行同步
     * @return instance
     */
    /*public static synchronized SafeLazySingleton getInstance(){
        if(instance == null){
            instance = new SafeLazySingleton();
        }
        return instance;
    }*/

    /**
     * 在实例化上加锁，但还是会存在线程不安全问题
     * @return instance
     */
    /*public static SafeLazySingleton getInstance(){
        if(instance == null){
            synchronized (SafeLazySingleton.class){
                instance = new SafeLazySingleton();
            }
        }
        return instance;
    }*/

    /**
     * double-check
     * @return instance
     */
    public static SafeLazySingleton getInstance(){
        if(instance == null){
            synchronized (SafeLazySingleton.class){
                if(instance == null){
                    instance = new SafeLazySingleton();
                }
            }
        }
        return instance;
    }

    /**
     * 解决序列化/反序列化破坏单例模式
     * Java类的反序列化过程中，会通过反射调用类的默认构造函数来初始化对象
     * @return Object
     */
    private Object readResolve(){
        return instance;
    }
}
